// Standard C++ includes
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <cstring>

#include <mysql_connection.h>
#include <mysql_driver.h>

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

#include "DataBase.h"
#include "PagoServicioDB.h"

using namespace std;

PagoServicioDB::PagoServicioDB()
{
}

/**
  Inserta un pago nuevo a la base de datos
  Entrada: Pago a realizar
*/
void PagoServicioDB::insert(PagoServicio pago){
    sql::Driver * driver = sql::mysql::get_driver_instance();
    /* Usando el Driver se pide una coneccion */
    std::auto_ptr< sql::Connection > con(driver->connect(HOST_URL, USER, PASS));

    /* Se crea un Statement */
    std::auto_ptr< sql::Statement > stmt(con->createStatement());

    //Se señala la base de datos a utilizar
    stringstream sqlDB;
    sqlDB.str("");
    sqlDB << "USE " <<DB_NAME;
    stmt->execute(sqlDB.str());

    //Se crea la consulta
    stringstream sql;
    sql.str("");
    sql << "INSERT INTO PagoServicio(idServicio,noReferencia,monto) VALUES("
        <<pago.getIdServicio()<<","<<pago.getNoReferencia()<<","<<pago.getMonto()<<");";
    //Se ejecuta la instruccion
    stmt->execute(sql.str());
    stmt.reset(NULL); /* Limpiar el objeto  */
    con.reset(driver->connect(HOST_URL, USER, PASS));
}

/**
  Busca un pago de acuerdo al no de referencia
  Entrada: No de Referencia a buscar
  Salida: El pago correspondiente a la referencia ingresada
 */
PagoServicio PagoServicioDB::getByNoReferencia(int noReferencia){
    sql::Driver * driver = sql::mysql::get_driver_instance();
    /* Usando el Driver se pide una coneccion */
    std::auto_ptr< sql::Connection > con(driver->connect(HOST_URL, USER, PASS));

    /* Se crea un Statement */
    std::auto_ptr< sql::Statement > stmt(con->createStatement());

    //Se señala la base de datos a utilizar
    stringstream sqlDB;
    sqlDB.str("");
    sqlDB << "USE " <<DB_NAME;
    stmt->execute(sqlDB.str());

    //Se crea la consulta
    stringstream sql;
    sql.str("");
    sql << "SELECT * FROM PagoServicio WHERE noReferencia ="<< noReferencia <<";";

    //Se crea el Result Set a partir de la consulta deseada
    std::auto_ptr< sql::ResultSet > res(stmt->executeQuery(sql.str()));
    //cout<<"Consulta: "<< "SELECT * FROM Cuenta WHERE noCuenta ="<< noCuenta <<";"<<endl;

    /* Numero de rows en el result set */
    //cout << "#\t\t Rows Count: \t";
    //cout << "res->rowsCount() = " << res->rowsCount() << endl;

    /* Obtener Datos */
    while (res->next()) {
        PagoServicio pago = PagoServicio();
        pago.setIdPago(res->getInt("idPago"));
        pago.setIdServicio(res->getInt("idServicio"));
        pago.setNoReferencia(res->getInt("noReferencia"));
        pago.setMonto(res->getDouble("monto"));
        stmt.reset(NULL); /* Limpiar el objeto  */
        con.reset(driver->connect(HOST_URL, USER, PASS));
        return pago;
    }

    stmt.reset(NULL); /* Limpiar el objeto  */
    con.reset(driver->connect(HOST_URL, USER, PASS));
    return PagoServicio();
}
